libhandy_header_subdir = package_subdir / package_api_name
libhandy_header_dir = get_option('includedir') / libhandy_header_subdir
libhandy_resources = gnome.compile_resources(
   'hdy-resources',
   'handy.gresources.xml',

   c_name: 'hdy',
)

hdy_public_enum_headers = [
  'hdy-deck.h',
  'hdy-flap.h',
  'hdy-header-bar.h',
  'hdy-header-group.h',
  'hdy-leaflet.h',
  'hdy-navigation-direction.h',
  'hdy-squeezer.h',
  'hdy-style-manager.h',
  'hdy-tab-bar.h',
  'hdy-view-switcher.h',
]

hdy_private_enum_headers = [
  'hdy-stackable-box-private.h',
  'hdy-settings-private.h',
]

version_data = configuration_data()
version_data.set('HDY_MAJOR_VERSION', handy_version_major)
version_data.set('HDY_MINOR_VERSION', handy_version_minor)
version_data.set('HDY_MICRO_VERSION', handy_version_micro)
version_data.set('HDY_VERSION', meson.project_version())

hdy_version_h = configure_file(
           input: 'hdy-version.h.in',
          output: 'hdy-version.h',
     install_dir: libhandy_header_dir,
   configuration: version_data)

libhandy_generated_headers = [
]

install_headers(['handy.h'],
  subdir: libhandy_header_subdir)

# Filled out in the subdirs
libhandy_public_headers = []
libhandy_public_sources = []
libhandy_private_sources = []

hdy_public_enums = gnome.mkenums_simple('hdy-enums',
         sources: hdy_public_enum_headers,
     body_prefix: '#include "config.h"',
   header_prefix: '#if !defined(_HANDY_INSIDE) && !defined(HANDY_COMPILATION)\n' +
                  '#error "Only <handy.h> can be included directly."\n' +
                  '#endif\n' +
                  '\n' +
                  '#include "hdy-version.h"\n',
       decorator: 'HDY_AVAILABLE_IN_ALL',
  install_header: true,
     install_dir: libhandy_header_dir,
)

hdy_private_enums = gnome.mkenums_simple('hdy-enums-private',
         sources: hdy_private_enum_headers,
     body_prefix: '#include "config.h"',
   header_prefix: '#if !defined(_HANDY_INSIDE) && !defined(HANDY_COMPILATION)\n' +
                  '#error "Only <handy.h> can be included directly."\n' +
                  '#endif\n' +
                  '\n' +
                  '#include "hdy-enums.h"\n',
  install_header: false,
)

libhandy_public_sources += [hdy_public_enums[0]]
libhandy_private_sources += hdy_private_enums
libhandy_generated_headers += [hdy_public_enums[1]]

src_headers = [
  'hdy-action-row.h',
  'hdy-animation.h',
  'hdy-application-window.h',
  'hdy-avatar.h',
  'hdy-carousel.h',
  'hdy-carousel-indicator-dots.h',
  'hdy-carousel-indicator-lines.h',
  'hdy-clamp.h',
  'hdy-combo-row.h',
  'hdy-deck.h',
  'hdy-enum-value-object.h',
  'hdy-expander-row.h',
  'hdy-flap.h',
  'hdy-header-bar.h',
  'hdy-header-group.h',
  'hdy-keypad.h',
  'hdy-leaflet.h',
  'hdy-main.h',
  'hdy-navigation-direction.h',
  'hdy-preferences-group.h',
  'hdy-preferences-page.h',
  'hdy-preferences-row.h',
  'hdy-preferences-window.h',
  'hdy-search-bar.h',
  'hdy-squeezer.h',
  'hdy-status-page.h',
  'hdy-style-manager.h',
  'hdy-swipe-group.h',
  'hdy-swipe-tracker.h',
  'hdy-swipeable.h',
  'hdy-tab-bar.h',
  'hdy-tab-view.h',
  'hdy-title-bar.h',
  'hdy-types.h',
  'hdy-value-object.h',
  'hdy-view-switcher.h',
  'hdy-view-switcher-bar.h',
  'hdy-view-switcher-title.h',
  'hdy-window.h',
  'hdy-window-handle.h',
]

sed = find_program('sed', required: true)
gen_public_types = find_program('gen-public-types.sh', required: true)

libhandy_init_public_types = custom_target('hdy-public-types.c',
   output: 'hdy-public-types.c',
    input: [src_headers, libhandy_generated_headers],
  command: [gen_public_types, '@INPUT@'],
  capture: true,
)

src_sources = [
  'hdy-action-row.c',
  'hdy-animation.c',
  'hdy-application-window.c',
  'hdy-avatar.c',
  'hdy-carousel.c',
  'hdy-carousel-indicator-dots.c',
  'hdy-carousel-indicator-lines.c',
  'hdy-clamp.c',
  'hdy-combo-row.c',
  'hdy-deck.c',
  'hdy-enum-value-object.c',
  'hdy-expander-row.c',
  'hdy-flap.c',
  'hdy-header-bar.c',
  'hdy-header-group.c',
  'hdy-keypad.c',
  'hdy-leaflet.c',
  'hdy-main.c',
  'hdy-navigation-direction.c',
  'hdy-preferences-group.c',
  'hdy-preferences-page.c',
  'hdy-preferences-row.c',
  'hdy-preferences-window.c',
  'hdy-search-bar.c',
  'hdy-squeezer.c',
  'hdy-status-page.c',
  'hdy-style-manager.c',
  'hdy-swipe-group.c',
  'hdy-swipe-tracker.c',
  'hdy-swipeable.c',
  'hdy-tab-bar.c',
  'hdy-tab-view.c',
  'hdy-title-bar.c',
  'hdy-value-object.c',
  'hdy-view-switcher.c',
  'hdy-view-switcher-bar.c',
  'hdy-view-switcher-title.c',
  'hdy-window.c',
  'hdy-window-handle.c',
]

# Files that should not be introspected
libhandy_private_sources += files([
  'gtkprogresstracker.c',
  'gtk-window.c',
  'hdy-avatar-icon.c',
  'hdy-bidi.c',
  'hdy-carousel-box.c',
  'hdy-css.c',
  'hdy-fading-label.c',
  'hdy-keypad-button.c',
  'hdy-nothing.c',
  'hdy-settings.c',
  'hdy-shadow-helper.c',
  'hdy-stackable-box.c',
  'hdy-tab.c',
  'hdy-tab-box.c',
  'hdy-view-switcher-button.c',
  'hdy-window-handle-controller.c',
  'hdy-window-mixin.c',
])

libhandy_public_headers += files(src_headers)
libhandy_public_sources += files(src_sources)

install_headers(src_headers, subdir: libhandy_header_subdir)


libhandy_sources = [
  libhandy_generated_headers,
  libhandy_public_sources,
  libhandy_private_sources,
  libhandy_resources,
  libhandy_init_public_types,
]

glib_min_version = '>= 2.44'

gio_dep = dependency('gio-2.0', version: glib_min_version)
gtk_dep = dependency('gtk+-3.0', version: '>= 3.24.1')

libhandy_deps = [
  dependency('glib-2.0', version: glib_min_version),
  dependency('gmodule-2.0', version: glib_min_version),
  dependency('fribidi'),
  gio_dep,
  gtk_dep,
  cc.find_library('m', required: false),
  cc.find_library('rt', required: false),
]

libhandy_public_deps = [
  gio_dep,
  gtk_dep,
]

libhandy_c_args = [
  '-DG_LOG_DOMAIN="Handy"',
]

config_h = configuration_data()
config_h.set_quoted('GETTEXT_PACKAGE', 'libhandy')
config_h.set_quoted('LOCALEDIR', get_option('prefix') / get_option('localedir'))
config_h.set_quoted('PREFIX', get_option('prefix'))

# Symbol visibility
if target_system == 'windows'
  config_h.set('DLL_EXPORT', true)
  config_h.set('_HDY_EXTERN', '__declspec(dllexport) extern')
  if cc.get_id() != 'msvc'
    libhandy_c_args += ['-fvisibility=hidden']
  endif
else
  config_h.set('_HDY_EXTERN', '__attribute__((visibility("default"))) extern')
  libhandy_c_args += ['-fvisibility=hidden']
endif

configure_file(
         output: 'config.h',
  configuration: config_h,
)

libhandy_link_args = []
libhandy_symbols_file = 'libhandy.syms'

# Check linker flags
ld_version_script_arg = '-Wl,--version-script,@0@/@1@'.format(meson.source_root(),
                                                              libhandy_symbols_file)
if cc.links('int main() { return 0; }', args : ld_version_script_arg, name : 'ld_supports_version_script')
  libhandy_link_args += [ld_version_script_arg]
endif

# set default libdir on win32 for libhandy target to keep MinGW compatibility
if target_system == 'windows'
  handy_libdir = [true]
else
  handy_libdir = libdir
endif

libhandy = shared_library(
  'handy-' + apiversion,
  libhandy_sources,

            soversion: soversion,
               c_args: libhandy_c_args,
         dependencies: libhandy_deps,
  include_directories: [ root_inc, src_inc ],
              install: true,
            link_args: libhandy_link_args,
          install_dir: handy_libdir,
)

libhandy_dep = declare_dependency(
              sources: libhandy_generated_headers,
         dependencies: libhandy_public_deps,
            link_with: libhandy,
  include_directories: include_directories('.'),
)

if introspection

   libhandy_gir_extra_args = [
     '--c-include=handy.h',
     '--quiet',
     '-DHANDY_COMPILATION',
   ]

   libhandy_gir = gnome.generate_gir(libhandy,
                 sources: libhandy_generated_headers + libhandy_public_headers + libhandy_public_sources,
               nsversion: apiversion,
               namespace: 'Handy',
         export_packages: package_api_name,
           symbol_prefix: 'hdy',
       identifier_prefix: 'Hdy',
               link_with: libhandy,
                includes: ['Gio-2.0', 'Gtk-3.0'],
                 install: true,
         install_dir_gir: girdir,
     install_dir_typelib: typelibdir,
              extra_args: libhandy_gir_extra_args,
   )

   if get_option('vapi')

     libhandy_vapi = gnome.generate_vapi(package_api_name,
             sources: libhandy_gir[0],
            packages: [ 'gio-2.0', 'gtk+-3.0' ],
             install: true,
         install_dir: vapidir,
       metadata_dirs: [ meson.current_source_dir() ],
     )

   endif
endif

pkgg = import('pkgconfig')

pkgg.generate(
    libraries: [libhandy],
      subdirs: libhandy_header_subdir,
      version: meson.project_version(),
         name: 'Handy',
     filebase: package_api_name,
  description: 'Handy Mobile widgets',
     requires: 'gtk+-3.0',
  install_dir: libdir / 'pkgconfig',
)
